package org.jsets.fastboot.util;

import java.util.Objects;
import lombok.extern.slf4j.Slf4j;

/**
 * 
 * 类型转换工具
 * @author wj596
 *
 */
@Slf4j
public abstract class TypeCastUtils {

	/**
	 * 类型转换
	 * @param o 参数
	 * @return 转换类型后的对象
	 */
	public static <T> T cast(Object o) {
		if (Objects.isNull(o)) {
			return null;
		}
		return (T) o;
	}

	/**
	 * 转字符串
	 * @param object 参数
	 * @return 字符串
	 */
	public static String toString(final Object object) {
		if (null == object) {
			return null;
		}
		if (object instanceof String) {
			return (String) object;
		}
		return object.toString();
	}
	
	/**
	 * 转Integer
	 * @param object 参数
	 * @return Integer
	 */
	public static Integer toInteger(final Object object) {
		if (Objects.isNull(object)) {
			return null;
		}
		
		if (object instanceof Integer) {
			return (Integer) object;
		}
		
		String str = toString(object);
		if(StringUtils.isBlank(str)) {
			return null;
		}
		
		return Integer.valueOf(str);
	}
	
	/**
	 * 转 Integer
	 * @param object 参数
	 * @param defaultValue 默认值
	 * @return Integer
	 */
	public static Integer toInteger(final Object object, final Integer defaultValue) {
		if (Objects.isNull(object)) {
			return defaultValue;
		}
		
		if (object instanceof Integer) {
			return (Integer) object;
		}
		
		String str = toString(object);
		if(StringUtils.isBlank(str)) {
			return defaultValue;
		}
		
		try {
			return Integer.valueOf(str);
		}catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		
		return defaultValue;
	}
	
	
	/**
	 * 转 Long
	 * @param object 参数
	 * @return Long
	 */
	public static Long toLong(final Object object) {
		if (Objects.isNull(object)) {
			return null;
		}
		if (object instanceof Long) {
			return (Long) object;
		}
		
		String str = toString(object);
		if(StringUtils.isBlank(str)) {
			return null;
		}
		
		return Long.valueOf(str);
	}
	
	/**
	 * 转 Long
	 * @param object 参数
	 * @param defaultValue 默认值
	 * @return Long
	 */
	public static Long toLong(final Object object, final Long defaultValue) {
		if (Objects.isNull(object)) {
			return defaultValue;
		}
		if (object instanceof Long) {
			return (Long) object;
		}
		
		String str = toString(object);
		if(StringUtils.isBlank(str)) {
			return defaultValue;
		}
		
		try {
			return Long.valueOf(str);
		}catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		
		return defaultValue;
	}

	/**
	 * 转 Float
	 * @param object 参数
	 * @return Float
	 */
	public static Float toFloat(final Object object) {
		if (Objects.isNull(object)) {
			return null;
		}
		if (object instanceof Float) {
			return (Float) object;
		}
		
		String str = toString(object);
		if(StringUtils.isBlank(str)) {
			return null;
		}
		
		return Float.valueOf(str);
	}
	
	/**
	 * 转 Float
	 * @param object 参数
	 * @param defaultValue 默认值
	 * @return Float
	 */
	public static Float toFloat(final Object object, final Float defaultValue) {
		if (Objects.isNull(object)) {
			return defaultValue;
		}
		
		if (object instanceof Float) {
			return (Float) object;
		}
		
		String str = toString(object);
		if(StringUtils.isBlank(str)) {
			return defaultValue;
		}
		
		try {
			return Float.valueOf(str);
		}catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		
		return defaultValue;
	}

	/**
	 * 转 Double
	 * @param object 参数
	 * @return Double
	 */
	public Double toDouble(final Object object) {
		if (Objects.isNull(object)) {
			return null;
		}
		
		if (object instanceof Double) {
			return (Double) object;
		}
		
		String str = toString(object);
		if(StringUtils.isBlank(str)) {
			return null;
		}
		
		return Double.valueOf(str);
	}
	
	/**
	 * 转 Double
	 * @param object 参数
	 * @param defaultValue 默认值
	 * @return Double
	 */
	public Double toDouble(final Object object, final Double defaultValue) {
		if (Objects.isNull(object)) {
			return defaultValue;
		}
		if (object instanceof Double) {
			return (Double) object;
		}
		
		String str = toString(object);
		if(StringUtils.isBlank(str)) {
			return defaultValue;
		}
		
		try {
			return Double.valueOf(str);
		}catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		
		return defaultValue;
	}
	
	/**
	 * 转 Boolean
	 * @param object 参数
	 * @return Boolean
	 */
	public static Boolean toBoolean(final Object object) {
		if (Objects.isNull(object)) {
			return null;
		}
		
		if (object instanceof Boolean) {
			return (Boolean) object;
		}
		
		String str = toString(object);
		if(StringUtils.isBlank(str)) {
			return null;
		}
		
		if ("1".equals(str) || "true".equals(str)) {
			return true;
		}
		if ("0".equals(str) || "false".equals(str)) {
			return false;
		}
		
		return null;
	}

	/**
	 * 转 Boolean
	 * @param object 参数
	 * @param defaultValue 默认值
	 * @return Boolean
	 */
	public static Boolean toBoolean(final Object object, final Boolean defaultValue) {
		if (Objects.isNull(object)) {
			return defaultValue;
		}
		
		if (object instanceof Boolean) {
			return (Boolean) object;
		}
		
		String str = toString(object);
		if(StringUtils.isBlank(str)) {
			return defaultValue;
		}
		
		if ("1".equals(str) || "true".equals(str)) {
			return true;
		}
		if ("0".equals(str) || "false".equals(str)) {
			return false;
		}
		
		return defaultValue;
	}

}